home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 039a / d3d.zip / 3DGR.C next >
Text File  |  1989-04-25  |  20KB  |  562 lines

  1. /* 3DGR - 3D Graphic Subroutines for Turbo C
  2.  
  3.    Written 8811.27 by Sir Mark Ewell Pendragon-Smythe, G.B.E.
  4.  
  5.    This series of subroutines contains all the necessary pieces to develop
  6.    and display three-dimensional wire-frame objects.  Because I could find
  7.    no readily available procedures to produce spheres or sections thereof,
  8.    I have written my own and included them here.  Use of these procedures
  9.    requires no licensing or acknowledgement.  I hope you find them helpful.
  10.  
  11.    Comments may be addressed to
  12.  
  13.    Sir Mark Ewell Pendragon-Smythe, G.B.E.
  14.    21 Strathallan Park
  15.    Suite 3
  16.    Rochester, NY  14607
  17.  
  18.    Please do not send electronic mail as I rarely use CompuServe.
  19. */
  20.  
  21. #include <graphics.h>
  22. #include <math.h>
  23. #include <stdio.h>
  24.  
  25. double c[3][3];                                  /* Calculation Matrix */
  26. double sc;                                       /* Scaling Factor     */
  27. double degree = 3.141592654 / 180;
  28. int    xc;                                       /* Screen x-centre    */
  29. int    yc;                                       /* Screen y-centre    */
  30. int    xp;                                       /* Plotable x coord   */
  31. int    yp;                                       /* Plotable y coord   */
  32. int    zp;                                       /* Computed z coord   */
  33.  
  34. void set3d(double xrot,                          /* Roll               */
  35.            double yrot,                          /* Pitch              */
  36.            double zrot)                          /* Yaw                */
  37.  
  38. /* Sets up 3D calculation matrices */
  39.  
  40. {
  41.   double rx,ry,rz;
  42.  
  43.   rx=xrot*degree;
  44.   ry=yrot*degree;
  45.   rz=zrot*degree;
  46.  
  47.   c[1][1]=cos(rx)*sc;
  48.   c[1][2]=cos(ry)*sc;
  49.   c[1][3]=cos(rz)*sc;
  50.  
  51.   c[2][1]=sin(rx)*sc;
  52.   c[2][2]=sin(ry)*sc;
  53.   c[2][3]=sin(rz)*sc;
  54. }
  55.  
  56. void calc3d(double aa,                           /* X coord (actual)   */
  57.             double bb,                           /* Y coord (actual)   */
  58.             double cc)                           /* Z coord (actual)   */
  59.  
  60. /* Calculates a point in 3D given parametres in c[][] */
  61.  
  62. {
  63.   double xa,ya,za;
  64.  
  65.   xa=c[1][3]*aa-c[2][3]*bb;
  66.   ya=c[2][3]*aa+c[1][3]*bb;
  67.   xp=c[1][1]*xa+c[2][1]*cc;
  68.   za=c[1][1]*cc-c[2][1]*xa;
  69.   yp=c[1][2]*ya-c[2][2]*za;
  70.   zp=c[2][2]*ya+c[1][2]*za;
  71. }
  72.  
  73. void line3d(double x1,
  74.             double y1,
  75.             double z1,
  76.             double x2,
  77.             double y2,
  78.             double z2,
  79.             int    box)
  80. /* Generates a 3D line
  81.      box values    0    regular line
  82.             1    box in x1
  83.             2    box in y1
  84.             3    box in z1
  85.             4    box in x2
  86.             5    box in y2
  87.             6    box in z2*/
  88. {
  89.   int xx,yy;
  90.  
  91.   switch(box)
  92.   {
  93.     case 0 : {
  94.                  calc3d(x1,y1,z1);
  95.                          xx=xp;
  96.                  yy=yp;
  97.                          calc3d(x2,y2,z2);
  98.                          line(xx+xc,yy+yc,xp+xc,yp+yc);
  99.               break;
  100.            }
  101.     case 1 : {
  102.                          calc3d(x1,y1,z1);
  103.                          xx=xp;
  104.                          yy=yp;
  105.                          calc3d(x1,y2,z1);
  106.                          line(xx+xc,yy+yc,xp+xc,yp+yc);
  107.                  moveto(xp+xc,yp+yc);
  108.                          calc3d(x1,y2,z2);
  109.                          lineto(xp+xc,yp+yc);
  110.                          calc3d(x1,y1,z2);
  111.                          lineto(xp+xc,yp+yc);
  112.                          lineto(xx+xc,yy+yc);
  113.               break;
  114.            }
  115.     case 2 : {
  116.                  calc3d(x1,y1,z1);
  117.                  xx=xp;
  118.                  yy=yp;
  119.                  calc3d(x2,y1,z1);
  120.                  line(xx+xc,yy+yc,xp+xc,yp+yc);
  121.                  moveto(xp+xc,yp+yc);
  122.                  calc3d(x2,y1,z2);
  123.                  lineto(xp+xc,yp+yc);
  124.                  calc3d(x1,y1,z2);
  125.                  lineto(xp+xc,yp+yc);
  126.                  lineto(xx+xc,yy+yc);
  127.               break;
  128.            }
  129.     case 3 : {
  130.                  calc3d(x1,y1,z1);
  131.                  xx=xp;
  132.                  yy=yp;
  133.                  calc3d(x2,y1,z1);
  134.                  line(xx+xc,yy+yc,xp+xc,yp+yc);
  135.                  moveto(xp+xc,yp+yc);
  136.                  calc3d(x2,y2,z1);
  137.                  lineto(xp+xc,yp+yc);
  138.                  calc3d(x1,y2,z1);
  139.                  lineto(xp+xc,yp+yc);
  140.                  lineto(xx+xc,yy+yc);
  141.               break;
  142.            }
  143.     case 4 : {
  144.                  calc3d(x2,y1,z1);
  145.                  xx=xp;
  146.                  yy=yp;
  147.                  calc3d(x2,y2,z1);
  148.                 line(xx+xc,yy+yc,xp+xc,yp+yc);
  149.                  moveto(xp+xc,yp+yc);
  150.                  calc3d(x2,y2,z2);
  151.                  lineto(xp+xc,yp+yc);
  152.                  calc3d(x2,y1,z2);
  153.                  lineto(xp+xc,yp+yc);
  154.                  lineto(xx+xc,yy+yc);
  155.               break;
  156.            }
  157.     case 5 : {
  158.                  calc3d(x1,y2,z1);
  159.                  xx=xp;
  160.                  yy=yp;
  161.                  calc3d(x2,y2,z1);
  162.                  line(xx+xc,yy+yc,xp+xc,yp+yc);
  163.                  moveto(xp+xc,yp+yc);
  164.                  calc3d(x2,y2,z2);
  165.                  lineto(xp+xc,yp+yc);
  166.                  calc3d(x1,y2,z2);
  167.                  lineto(xp+xc,yp+yc);
  168.                  lineto(xx+xc,yy+yc);
  169.               break;
  170.            }
  171.     case 6 : {
  172.                  calc3d(x1,y1,z2);
  173.                  xx=xp;
  174.                  yy=yp;
  175.                  calc3d(x2,y1,z2);
  176.                  line(xx+xc,yy+yc,xp+xc,yp+yc);
  177.                  moveto(xp+xc,yp+yc);
  178.                  calc3d(x2,y2,z2);
  179.                  lineto(xp+xc,yp+yc);
  180.                  calc3d(x1,y2,z2);
  181.                  lineto(xp+xc,yp+yc);
  182.                  lineto(xx+xc,yy+yc);
  183.               break;
  184.            }
  185.     }
  186. }
  187.  
  188. void axis3d(double minx,                         /* First x coord      */
  189.             double maxx,                         /* Second x coord     */
  190.             double miny,                         /* First y coord      */
  191.             double maxy,                         /* Second y coord     */
  192.             double minz,                         /* First x coord      */
  193.             double maxz)                         /* Second y coord     */
  194.  
  195. /* Draws a series of axis lines */
  196.  
  197. {
  198.   calc3d(minx,0,0);
  199.   moveto(xp+xc,yp+yc);
  200.   calc3d(maxx,0,0);
  201.   lineto(xp+xc,yp+yc);
  202.   calc3d(0,miny,0);
  203.   moveto(xp+xc,yp+yc);
  204.   calc3d(0,maxy,0);
  205.   lineto(xp+xc,yp+yc);
  206.   calc3d(0,0,minz);
  207.   moveto(xp+xc,yp+yc);
  208.   calc3d(0,0,maxz);
  209.   lineto(xp+xc,yp+yc);
  210. }
  211.  
  212. void arc3d(double xcentre,                       /* X centrepoint      */
  213.            double ycentre,                       /* Y centrepoint      */
  214.            double zcentre,                       /* Z centrepoint      */
  215.            double starta,                        /* Starting angle     */
  216.            double enda,                          /* Ending angle       */
  217.            double incra,                         /* Angular increment  */
  218.            double radius,                        /* Radius of arc      */
  219.            int    axis)                          /* Axis               */
  220.  
  221. /* Draws an arc around the centre xcentre,ycentre,zcentre along axis points */
  222.  
  223. {
  224.   double cangle,cx,cy,cz;
  225.  
  226.   cangle=starta;
  227.   while (cangle<=enda)
  228.   {
  229.     switch(axis)
  230.     {
  231.       case 1 : {                         /*X-Y Axis*/
  232.                    cx=(radius*(cos(cangle*degree)));
  233.                    cy=(radius*(sin(cangle*degree)));
  234.                    cz=0;
  235.                 break;
  236.              }
  237.       case 2 : {                         /*X-Z Axis*/
  238.                    cx=(radius*(cos(cangle*degree)));
  239.                    cy=0;
  240.                    cz=(radius*(sin(cangle*degree)));
  241.                 break;
  242.              }
  243.       case 3 : {
  244.                    cx=0;                 /*Y-Z Axis*/
  245.                    cy=(radius*(sin(cangle*degree)));
  246.                    cz=(radius*(cos(cangle*degree)));
  247.                 break;
  248.              }
  249.     }
  250.     calc3d(cx+xcentre,cy+ycentre,cz+zcentre);
  251.     if (cangle==starta) moveto(xp+xc,yp+yc); else lineto(xp+xc,yp+yc);
  252.     cangle+=+incra;
  253.   }
  254. }
  255.  
  256. void meridian3d(double xcentre,                  /* X centrepoint      */
  257.             double ycentre,                      /* Y centrepoint      */
  258.             double zcentre,                      /* Z centrepoint      */
  259.             double xrad,                         /* X arcs radius      */
  260.             double yrad,                         /* Y arcs radius      */
  261.             double zrad,                         /* Z arcs radius      */
  262.             double starttheta,                   /* 1st parallel (in degrees) */
  263.             double finishtheta,                  /* Nth parallel (in degrees) */
  264.             double startphi,                     /* 1st meridian (in degrees) */
  265.             double finishphi,                    /* Nth meridian (in degrees) */
  266.             double increm)                       /* Angular increment  */
  267.  
  268. /* Draws a series of meridians around xcentre,ycentre,zcentre
  269.  
  270.    Practical values for theta are -90 thru 90
  271.    Practical values for phi   are 0 thru 360
  272. */
  273.  
  274. {
  275.   double wx = (cos(startphi*degree)*xrad*cos(starttheta*degree))+xcentre;
  276.   double wy = (sin(startphi*degree)*yrad*cos(starttheta*degree))+ycentre;
  277.   double wz = (sin(startphi*degree)*zrad)+zcentre;
  278.   double a,a1;
  279.  
  280.   calc3d(wx,wy,wz);
  281.   moveto(xp+xc,yp+yc);
  282.  
  283.   for(a=startphi;a<=finishphi;a+=increm)
  284.   {
  285.     wx=(cos(a*degree)*xrad*cos(starttheta*degree))+xcentre;
  286.     wy=(sin(a*degree)*yrad*cos(starttheta*degree))+ycentre;
  287.     wz=(sin(starttheta*degree)*zrad)+zcentre;
  288.     calc3d(wx,wy,wz);
  289.     moveto(xp+xc,yp+yc);
  290.     for(a1=starttheta;a1<=finishtheta;a1+=increm)
  291.     {
  292.       wx=(cos(a*degree)*xrad*cos(a1*degree))+xcentre;
  293.       wy=(sin(a*degree)*yrad*cos(a1*degree))+ycentre;
  294.       wz=(sin(a1*degree)*zrad)+zcentre;
  295.       calc3d(wx,wy,wz);
  296.       lineto(xp+xc,yp+yc);
  297.     }
  298.   }
  299. }
  300.  
  301. void parallel3d(double xcentre,                  /* X centrepoint      */
  302.             double ycentre,                      /* Y centrepoint      */
  303.             double zcentre,                      /* Z centrepoint      */
  304.             double xrad,                         /* X arcs radius      */
  305.             double yrad,                         /* Y arcs radius      */
  306.             double zrad,                         /* Z arcs radius      */
  307.             double starttheta,                   /* 1st parallel (in degrees) */
  308.             double finishtheta,                  /* Nth parallel (in degrees) */
  309.             double startphi,                     /* 1st meridian (in degrees) */
  310.             double finishphi,                    /* Nth meridian (in degrees) */
  311.             double increm)                       /* Angular increment  */
  312.  
  313. /* Draws a series of parallels around xcentre, ycentre, zcentre
  314.  
  315.    Practical values for theta are -90 thru 90
  316.    Practical values for phi   are 0 thru 360
  317. */
  318.  
  319. {
  320.   double wx = (cos(startphi*degree)*xrad*cos(starttheta*degree))+xcentre;
  321.   double wy = (sin(startphi*degree)*yrad*cos(starttheta*degree))+ycentre;
  322.   double wz = (sin(startphi*degree)*zrad)+zcentre;
  323.   double a,a1;
  324.  
  325.   calc3d(wx,wy,wz);
  326.   moveto(xp+xc,yp+yc);
  327.  
  328.   for(a=starttheta;a<=finishtheta;a+=increm)
  329.   {
  330.     wx=(cos(startphi*degree)*xrad*cos(a*degree))+xcentre;
  331.     wy=(sin(startphi*degree)*yrad*cos(a*degree))+ycentre;
  332.     wz=(sin(a*degree)*zrad)+zcentre;
  333.     calc3d(wx,wy,wz);
  334.     moveto(xp+xc,yp+yc);
  335.     for(a1=startphi;a1<=finishphi;a1+=increm)
  336.     {
  337.       wx=(cos(a1*degree)*xrad*cos(a*degree))+xcentre;
  338.       wy=(sin(a1*degree)*yrad*cos(a*degree))+ycentre;
  339.       wz=(sin(a*degree)*zrad)+zcentre;
  340.       calc3d(wx,wy,wz);
  341.       lineto(xp+xc,yp+yc);
  342.     }
  343.   }
  344. }
  345.  
  346. void globe3d(double xcentre,                     /* X centrepoint      */
  347.             double ycentre,                      /* Y centrepoint      */
  348.             double zcentre,                      /* Z centrepoint      */
  349.             double xrad,                         /* X arcs radius      */
  350.             double yrad,                         /* Y arcs radius      */
  351.             double zrad,                         /* Z arcs radius      */
  352.             double starttheta,                   /* 1st parallel (in degrees) */
  353.             double finishtheta,                  /* Nth parallel (in degrees) */
  354.             double startphi,                     /* 1st meridian (in degrees) */
  355.             double finishphi,                    /* Nth meridian (in degrees) */
  356.             double increm)                       /* Angular increment  */
  357.  
  358. /* Draws a globe or section thereof by combining the meridian and parallel functions
  359.  
  360.    Practical values for theta are -90 thru 90
  361.    Practical values for phi   are 0 thru 360
  362. */
  363.  
  364. {
  365.   meridian3d(xcentre,ycentre,zcentre,xrad,yrad,zrad,starttheta,finishtheta,startphi,finishphi,increm);
  366.   parallel3d(xcentre,ycentre,zcentre,xrad,yrad,zrad,starttheta,finishtheta,startphi,finishphi,increm);
  367. }
  368.  
  369. void spike3d(double xcentre,                     /* X centrepoint      */
  370.             double ycentre,                      /* Y centrepoint      */
  371.             double zcentre,                      /* Z centrepoint      */
  372.             double xrad1,                        /* 1st x arcs radius  */
  373.             double yrad1,                        /* 1st y arcs radius  */
  374.             double zrad1,                        /* 1st z arcs radius  */
  375.             double xrad2,                        /* 2nd x arcs radius  */
  376.             double yrad2,                        /* 2nd y arcs radius  */
  377.             double zrad2,                        /* 2nd z arcs radius  */
  378.             double starttheta,                   /* 1st parallel (in degrees) */
  379.             double finishtheta,                  /* Nth parallel (in degrees) */
  380.             double startphi,                     /* 1st meridian (in degrees) */
  381.             double finishphi,                    /* Nth meridian (in degrees) */
  382.             double increm)                       /* Angular increment  */
  383.  
  384. /* Draws lines between two angularly similar points with different radii
  385.  
  386.    Practical values for theta are -90 thru 90
  387.    Practical values for phi   are 0 thru 360
  388. */
  389.  
  390. {
  391.   double wx = (cos(startphi*degree)*xrad1*cos(starttheta*degree))+xcentre;
  392.   double wy = (sin(startphi*degree)*yrad1*cos(starttheta*degree))+ycentre;
  393.   double wz = (sin(startphi*degree)*zrad1)+zcentre;
  394.   double a,a1;
  395.  
  396.   calc3d(wx,wy,wz);
  397.   moveto(xp+xc,yp+yc);
  398.  
  399.   for(a=starttheta;a<=finishtheta;a+=increm)
  400.   {
  401.     wx=(cos(startphi*degree)*xrad1*cos(a*degree))+xcentre;
  402.     wy=(sin(startphi*degree)*yrad1*cos(a*degree))+ycentre;
  403.     wz=(sin(a*degree)*zrad1)+zcentre;
  404.     calc3d(wx,wy,wz);
  405.     moveto(xp+xc,yp+yc);
  406.     wx=(cos(startphi*degree)*xrad2*cos(a*degree))+xcentre;
  407.     wy=(sin(startphi*degree)*yrad2*cos(a*degree))+ycentre;
  408.     wz=(sin(a*degree)*zrad2)+zcentre;
  409.     calc3d(wx,wy,wz);
  410.     lineto(xp+xc,yp+yc);
  411.     for(a1=startphi;a1<=finishphi;a1+=increm)
  412.     {
  413.       wx=(cos(a1*degree)*xrad1*cos(a*degree))+xcentre;
  414.       wy=(sin(a1*degree)*yrad1*cos(a*degree))+ycentre;
  415.       wz=(sin(a*degree)*zrad1)+zcentre;
  416.       calc3d(wx,wy,wz);
  417.       moveto(xp+xc,yp+yc);
  418.       wx=(cos(a1*degree)*xrad2*cos(a*degree))+xcentre;
  419.       wy=(sin(a1*degree)*yrad2*cos(a*degree))+ycentre;
  420.       wz=(sin(a*degree)*zrad2)+zcentre;
  421.       calc3d(wx,wy,wz);
  422.       lineto(xp+xc,yp+yc);
  423.     }
  424.   }
  425. }
  426.  
  427. void sector3d(double xcentre,                    /* X centrepoint      */
  428.             double ycentre,                      /* Y centrepoint      */
  429.             double zcentre,                      /* Z centrepoint      */
  430.             double xrad1,                        /* 1st x arcs radius  */
  431.             double yrad1,                        /* 1st y arcs radius  */
  432.             double zrad1,                        /* 1st z arcs radius  */
  433.             double xrad2,                        /* 2nd x arcs radius  */
  434.             double yrad2,                        /* 2nd y arcs radius  */
  435.             double zrad2,                        /* 2nd z arcs radius  */
  436.             double starttheta,                   /* 1st parallel (in degrees) */
  437.             double finishtheta,                  /* Nth parallel (in degrees) */
  438.             double startphi,                     /* 1st meridian (in degrees) */
  439.             double finishphi,                    /* Nth meridian (In degrees) */
  440.             double increm)                       /* Angular increment  */
  441.  
  442. /* Draws a "chunk" or sector of a sphere
  443.  
  444.    Practical values for theta are -90 thru 90
  445.    Practical values for phi   are 0 thru 360
  446. */
  447.  
  448. {
  449.   globe3d(xcentre,ycentre,zcentre,xrad1,yrad1,zrad1,starttheta,finishtheta,startphi,finishphi,increm);
  450.   globe3d(xcentre,ycentre,zcentre,xrad2,yrad2,zrad2,starttheta,finishtheta,startphi,finishphi,increm);
  451.   spike3d(xcentre,ycentre,zcentre,xrad1,yrad1,zrad1,xrad2,yrad2,zrad2,starttheta,finishtheta,startphi,finishphi,increm);
  452. }
  453.  
  454. main()
  455.  
  456. /* This demonstration program may be deleted at user's discretion */
  457.  
  458. {
  459.   int graphdriver, graphmode, grapherror;
  460.   double a;
  461.  
  462.   detectgraph(&graphdriver, &graphmode);
  463.   if(graphdriver < 0) printf("No graphics hardware detected\n");
  464.   initgraph(&graphdriver, &graphmode,"");
  465.   grapherror = graphresult();
  466.   if(grapherror < 0)
  467.   {
  468.     printf("Error: %s\n", grapherrormsg(grapherror));
  469.     exit(0);
  470.   }
  471.   cleardevice();
  472.  
  473.   xc=getmaxx()/2;                      /* Initialize centre */
  474.   yc=getmaxy()/2;
  475.  
  476.   sc=1.0;                              /* Set scale         */
  477.   set3d(10,70,60);                     /* Set viewing angle */
  478.  
  479. /* line3d demo */
  480.  
  481.   outtextxy(10,10,"Viewing angle 10 by 70 by 60");
  482.   outtextxy(10,20,"3D cube");
  483.   for(a=1;a<7;a++)
  484.   {
  485.     line3d(-50,-50,-50,50,50,50,a);
  486.   }
  487.   outtextxy(10,30,"Press [ENTER] to continue.");
  488.   getchar();
  489.  
  490. /* axis3d demo */
  491.  
  492.   outtextxy(xc,10,"Viewing angle 10 by 70 by 60");
  493.   outtextxy(xc,20,"3D Axis");
  494.   axis3d(-100,100,-100,100,-100,100);
  495.   outtextxy(xc,30,"Press [ENTER] to continue.");
  496.   getchar();
  497.  
  498. /* arc3d demo */
  499.  
  500.   outtextxy(10,50,"Viewing angle 10 by 70 by 60");
  501.   outtextxy(10,60,"3D Arcs");
  502.   for(a=1;a<4;a++)
  503.   {
  504.     arc3d(0,0,0,0,360,15,50,a);
  505.   }
  506.   outtextxy(10,70,"Press [ENTER] to continue.");
  507.   getchar();
  508.  
  509. /* meridian3d demo */
  510.  
  511.   initgraph(&graphdriver, &graphmode,"");
  512.   cleardevice();
  513.   outtextxy(10,10,"Viewing angle 10 by 70 by 60");
  514.   outtextxy(10,20,"3D Meridian:  Theta -90 to 90");
  515.   outtextxy(10,30,"              Phi   180 to 360");
  516.   meridian3d(0,0,0,75,75,75,-90,90,180,360,15);
  517.   outtextxy(10,40,"Press [ENTER] to continue.");
  518.   getchar();
  519.  
  520. /* parallel3d demo */
  521.  
  522.   outtextxy(xc,10,"Viewing angle 10 by 70 by 60");
  523.   outtextxy(xc,20,"3D Parallel:  Theta -90 to 90");
  524.   outtextxy(xc,30,"              Phi   0 to 180");
  525.   parallel3d(0,0,0,75,75,75,-90,90,0,180,15);
  526.   outtextxy(xc,40,"Press [ENTER] to continue.");
  527.   getchar();
  528.  
  529. /* globe3d demo */
  530.  
  531.   initgraph(&graphdriver, &graphmode,"");
  532.   cleardevice();
  533.   outtextxy(10,10,"Viewing angle 10 by 70 by 60");
  534.   outtextxy(10,20,"3D Globe  :  Theta -90 to 90");
  535.   outtextxy(10,30,"              Phi   0 to 360");
  536.   globe3d(0,0,0,75,75,75,-90,90,0,360,15);
  537.   outtextxy(10,40,"Press [ENTER] to continue.");
  538.   getchar();
  539.  
  540. /* spike3d demo */
  541.  
  542.   outtextxy(xc,10,"Viewing angle 10 by 70 by 60");
  543.   outtextxy(xc,20,"3D Spike   :  Theta -90 to 90");
  544.   outtextxy(xc,30,"              Phi   0 to 360");
  545.   spike3d(0,0,0,75,75,75,90,90,90,-90,90,0,360,15);
  546.   outtextxy(xc,40,"Press [ENTER] to continue.");
  547.   getchar();
  548.  
  549. /* sector3d demo */
  550.  
  551.   initgraph(&graphdriver, &graphmode,"");
  552.   cleardevice();
  553.   outtextxy(10,10,"Viewing angle 10 by 70 by 60");
  554.   outtextxy(10,20,"3D Sector :  Theta -90 to 90");
  555.   outtextxy(10,30,"              Phi   90 to 105");
  556.   sector3d(0,0,0,75,75,75,90,90,90,-90,90,90,105,15);
  557.   outtextxy(10,40,"Press [ENTER] to continue.");
  558.   getchar();
  559.  
  560.   restorecrtmode();
  561. }
  562.